/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo.PersistenciaJDBC;

import Modelo.Entidades.Alumno;
import Modelo.Entidades.AlumnoImpl;
import Modelo.Entidades.ProfesorImpl;
import Modelo.Entidades.Usuario;
import Modelo.Entidades.UsuarioImpl;
import Modelo.Persistencia.UsuarioDAO;
import Modelo.SHA1;
import java.security.NoSuchAlgorithmException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/*
 *  Proyecto eJAM [G12]
 *  Miembros:
 *      - Javier Ruiz Hidalgo
 *      - Adrian Ramos Cápitas
 *      - Miguel Alejandro Esteban Ordóñez
 */
 
public class UsuarioDAOJDBC implements UsuarioDAO {

    public boolean existeUsuario(String pk) {
        boolean confirmacion = false;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM USUARIO U WHERE U.DNI = '"+pk+"'");

            if (res.next()) {
                confirmacion = true;
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }

        return confirmacion;
    }

    public void create(Usuario entidad) {
        String sqlU = "INSERT INTO USUARIO(DNI,NOMBRE,AP1,AP2,EMAIL,TELEFONO,PASS) VALUES (?,?,?,?,?,?,?)";
        String sqlA = "INSERT INTO ALUMNO(DNI) VALUES (?)";
        String sqlP = "INSERT INTO PROFESOR(DNI) VALUES (?)";

        try {
            //Introducción de Informacion en la Tabla USUARIO
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sqlU);
            stm.setString(1, entidad.getDNI());
            stm.setString(2, entidad.getNombre());
            stm.setString(3, entidad.getApellido1());
            stm.setString(4, entidad.getApellido2());
            stm.setString(5, entidad.getCorreo());
            stm.setString(6, entidad.getTelefono());
            //Hash de la Contraseña
            try {
                stm.setString(7, SHA1.getInstance().getHash(entidad.getPass()));
            } catch (NoSuchAlgorithmException ex) {
                throw new RuntimeException(ex);
            }

            stm.execute();

            if (entidad.getClass().getName().equals("Modelo.Entidades.AlumnoImpl")) {
                //Introducción de Informacion en la Tabla ALUMNO
                stm = Persistencia.createConnection().prepareStatement(sqlA);
                stm.setString(1, entidad.getDNI());
                stm.execute();
            } else {
                //Introducción de Informacion en la Tabla PROFESOR
                stm = Persistencia.createConnection().prepareStatement(sqlP);
                stm.setString(1, entidad.getDNI());
                stm.execute();
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
    }

    public Usuario read(String pk) {
        Usuario usuario = null;
        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resA, resP, res = stmt.executeQuery("SELECT * FROM USUARIO WHERE DNI = '" +pk+ "'");
            String dni, nombre, ap1, ap2, correo, telefono, pass;
            if (res.next()) {
                dni = res.getString("DNI");
                nombre = res.getString("NOMBRE");
                ap1 = res.getString("AP1");
                ap2 = res.getString("AP2");
                correo = res.getString("EMAIL");
                telefono = res.getString("TELEFONO");
                pass = res.getString("PASS");

                resA = stmt.executeQuery("SELECT * FROM ALUMNO WHERE DNI = '" +pk+ "'");
                if(resA.next()){
                    usuario = new AlumnoImpl(nombre, ap1, ap2, dni, telefono, correo, pass);
                }
                else{
                    resP = stmt.executeQuery("SELECT * FROM PROFESOR WHERE DNI = '" +pk+ "'");
                    if(resP.next()){
                        usuario = new ProfesorImpl(nombre, ap1, ap2, dni, telefono, correo, pass);
                    }
                    else{
                        usuario = new UsuarioImpl(nombre, ap1, ap2, dni, telefono, correo, pass);
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return usuario;
    }

    public void update(Usuario entidad) {
        String sql = "UPDATE USUARIO SET NOMBRE=?, AP1=?, AP2=?, EMAIL=?, TELEFONO=? WHERE DNI LIKE ?";
        try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setString(1, entidad.getNombre());
            stm.setString(2, entidad.getApellido1());
            stm.setString(3, entidad.getApellido2());
            stm.setString(4, entidad.getCorreo());
            stm.setString(5, entidad.getTelefono());
            stm.setString(6, entidad.getDNI());

            stm.executeUpdate();

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
    }

    public void delete(Usuario entidad) {
        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            stmt.executeUpdate("DELETE FROM ALUMNO WHERE DNI= '" + entidad.getDNI()+ "'");
            stmt.executeUpdate("DELETE FROM PROFESOR WHERE DNI= '" + entidad.getDNI()+ "'");
            stmt.executeUpdate("DELETE FROM USUARIO WHERE DNI= '" + entidad.getDNI()+ "'");

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
    }

    public List<Usuario> list() {
        List<Usuario> usuariosPro = new ArrayList<Usuario>();
        List<Usuario> usuarios = new ArrayList<Usuario>();
        Usuario usuario = null;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resA, res = stmt.executeQuery("SELECT * FROM USUARIO");
            String dni, nombre, ap1, ap2, correo, telefono, pass;

            while (res.next()) {
                dni = res.getString("DNI");
                nombre = res.getString("NOMBRE");
                ap1 = res.getString("AP1");
                ap2 = res.getString("AP2");
                correo = res.getString("EMAIL");
                telefono = res.getString("TELEFONO");
                pass = res.getString("PASS");

                usuario = new UsuarioImpl(nombre, ap1, ap2, dni, telefono, correo, pass);
                usuariosPro.add(usuario);
            }

            for(Usuario u: usuariosPro){
                resA = stmt.executeQuery("SELECT * FROM ALUMNO WHERE DNI = '" +u.getDNI()+ "'");
                if(resA.next()){
                    usuario = new AlumnoImpl(u.getNombre(), u.getApellido1(), u.getApellido2(), u.getDNI(), u.getTelefono(), u.getCorreo(), u.getPass());
                    usuarios.add(usuario);
                }
                else{
                    resA = stmt.executeQuery("SELECT * FROM PROFESOR WHERE DNI = '" +u.getDNI()+ "'");
                    if(resA.next()){
                        usuario = new ProfesorImpl(u.getNombre(), u.getApellido1(), u.getApellido2(), u.getDNI(), u.getTelefono(), u.getCorreo(), u.getPass());
                        usuarios.add(usuario);
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return usuarios;
    }

    public List<Alumno> listarAlumnos() {
        List<Alumno> alumnos = new ArrayList<Alumno>();
        Alumno alumno = null;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resA, res = stmt.executeQuery("SELECT * FROM USUARIO U, ALUMNO A WHERE A.DNI = U.DNI");
            String dni, nombre, ap1, ap2, correo, telefono, pass;
            while (res.next()) {
                dni = res.getString("DNI");
                nombre = res.getString("NOMBRE");
                ap1 = res.getString("AP1");
                ap2 = res.getString("AP2");
                correo = res.getString("EMAIL");
                telefono = res.getString("TELEFONO");
                pass = res.getString("PASS");

                alumno = new AlumnoImpl(nombre, ap1, ap2, dni, telefono, correo, pass);
                alumnos.add(alumno);
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return alumnos;
    }

}
